package com.timo.rabbitmq.config;

import com.timo.constant.RabbitMqConstant;
import com.timo.constant.RabbitMqConstant.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description: Direct queue 和交换器的定义
 *
 * 因为要测试多个交换器的案例，为了防止队列名称重复的情况出现，这里就统一名命规范
 *  队列的结尾必是“DirectQueue”：helloDirectQueue
 *  交换器的结尾必须是“DirectExchange”：helloDirectExchange
 *  队列和交换器的绑定 （队列Bingding交换器：queueBindingExchange） 的名命格式1：helloDirectQueueBindingHelloDirectExchange
 *  队列和交换器的绑定 如果队列名称的前缀和交换器的前缀相同的情况下可以使用缩写  的名命格式2：helloDirectBinding
 * @Author: Timo
 * @Date: 2019/7/25 10:15
 */
@Slf4j
@Configuration
public class DirectRabbitMqConfig {

    /**
     * ##################################################
     * #    queue 的定义
     * #################################################
     */

    @Bean
    Queue helloDirectQueue() {
        return new Queue(DirectQueueEnum.HELLO_DIRECT_QUEUE.name,true);
    }

    /**
     * ##################################################
     * #    Exchange 的定义
     * #################################################
     */

    @Bean
    DirectExchange helloDirectExchange() {
        return new DirectExchange(DirectExchangeEnum.HELLO_DIRECT_EXCHANGE.name);
    }

    /**
     * ##################################################
     * #    Binding 将队列绑定要交换器上
     * #################################################
     */

    @Bean
    Binding helloDirectBinding() {
        return BindingBuilder.bind(helloDirectQueue()).to(helloDirectExchange()).with("hello.direct.key");
    }
}
